#!/usr/bin/env python
# coding=utf-8

# 广州康辉国际旅行社 
import os, sys, re, traceback, logging
import urllib,httplib
import time
import datetime
import getopt
import urllib2
from urllib2 import URLError
from Route  import *



vacationBlock_re = re.compile(r'''
       <li\b[^<>]*?>(.*?)</li>
        ''', re.X|re.S)

def do_crawl():
    try:
        server_urls = [('出境游', 'http://www.cctpage.com/travel/index_cj.asp?ctype=B')
                       ,('省外游', 'http://www.cctpage.com/travel/teamlist.asp?ctype=5')
                       ,('省内游','http://www.cctpage.com/travel/index_cxwq.asp')]
        
        for vacation_type, server_url in server_urls:
            html = urllib2.urlopen(server_url).read()
            html = html.decode("GB2312",'ignore').encode('utf-8')
            
            #是否继续
            goOn = True
            url = server_url
            while goOn:
                #获取所有描述线路的HTML片段 
                vacationBlockList = vacationBlock_re.findall(html)
                for div in vacationBlockList:
                    try:
                        route = Route()
                        #站点ID
                        route.site = 41
                        #提供商名称
                        route.supplier = '广州康辉国际旅行社  '
                        #供应商url
                        route.supplier_url = 'http://www.cctpage.com/'
                    
                        #线路标题
                        route.title = re.compile(r'''title="([^"]*?)"''', re.X|re.S).search(div).group(1).strip()
                        #线路url
                        route.rout_url = 'http://www.cctpage.com/travel/' + re.compile(r'''href="([^"]*?)"''', re.X|re.S).search(div).group(1)
                        #行程类型
                        route.type =vacation_type  
                        if route.title.find('自由行')>-1:
                            route.type = '自由行'
                        
                        #出发日期
                        dates_temp = re.compile(r'''<p\s*class="lx02">(.*?)</p>''', re.X|re.S).search(div)
                        if(dates_temp):
                            route.dates = getDate(dates_temp.group(1),'%Y-%m-%d','%Y-%m-%d')
                        #出发城市
                        route.outcity = '广州'
   
                        #价格
                        priceTemp = re.compile(r'''<p\s*class="lx04">成人:(\d+)''', re.X|re.S).search(div)
                        if priceTemp:
                            route.price = priceTemp.group(1)
                        else:
                            continue
                                             
                        innerHtml = urllib2.urlopen(route.rout_url).read()
                        innerHtml = innerHtml.decode("GB2312",'ignore').encode('utf-8')
    

                        #出发交通工具
                        route.go_t = '飞机'
                        #回程交通工具
                        route.back_t = '飞机'
                        
                        if vacation_type=='省内游':
                            route.go_t = '旅游空调车'
                            route.back_t = '旅游空调车'
                                    
                        #进一步解析 
                        do_parse(innerHtml,route)
                    except:
                        continue
                    print >>sys.stderr, 'updating:', route.supplier,'， 价格：',route.price, '， 天数：',route.days,'， 出发日期：',route.dates,'， 出发城市：',route.outcity,'， 到达城市：',route.dest,'， title：',route.title
                    
                    route.updRoute()
                    route.updRoute_Schedules()
                goOnTemp = re.compile(r'''(\d{1,3})</font>页/共(\d{1,3})页''', re.X | re.S).search(html)
                
                if(goOnTemp):
                    try:
                        current = int(goOnTemp.group(1))
                        total = int(goOnTemp.group(2))                        
                        if current == total:
                            goOn = False
                        else:                         
                            goOn = True
                    except:
                        goOn = False 
                else:
                    goOn = False
                if goOn:
                    url = u'http://www.cctpage.com/travel/'+re.compile(r'''href="([^<>]*)">下一页''', re.X | re.S).search(html).group(1).decode('utf-8')
                    url=url.encode('GB2312')
                    #对url编码，':?=/&'不编码
                    url=urllib2.quote(url,':?=/&')
                    print '--------------------------------------------'
                    print url
                    html = urllib2.urlopen(url).read()
                    html = html.decode("GB2312",'ignore').encode('utf-8')


    except:
        print traceback.format_exc(sys.exc_info())
        
# 将日期格式化
# 输入：'2010-8-4','%Y-%m-%d','%Y-%m-%d'
# 输出：'2008-08-04'
def getDate(dateStr,oldP,newP):
    try:
        dd = datetime.datetime.strptime(dateStr,oldP)
        return datetime.datetime.strftime(dd,newP)
    except:
        return ''


#解析每一天的行程安排----度假
def do_parse(html,route): 
    re_h=re.compile('</?\w+[^>]*>')#HTML标签
    #简介
    detail_block = re.compile(r'''<p><strong>行程特色：</strong>(.*?)</p>''', re.X|re.S).search(html)
    if(detail_block):
        detail_block = detail_block.group(1)
        detail=re_h.sub('',detail_block) #去掉HTML 标签
        route.detail = detail.replace('行程特色：','').replace('&nbsp;','').strip()
    
    #行程
    xingcheng_block = re.compile(r'''<p\s*class="lyb_tit">行程安排</p>(.*?)<p\s*class="lyb_tit">服务标准</p>''', re.X|re.S).search(html)
    if(xingcheng_block):   
        block =  xingcheng_block.group(1).strip()
        schedule_list = re.compile(r'''(<p>.*?</p>\s*<p>.*?</p>)''', re.X|re.S).findall(block)
        if schedule_list:  
            #行程天数
            route.days = len(schedule_list)
            i=0   
            for parthtml in schedule_list:
                schedule = Schedule()
        
                #第几天
                schedule.s_num = i+1
                
                #游览地点
                dest_temp = re.compile(u'''<font[^<>]*?">(?:-?第.{1,2}天)?\s*([^<>（）\s第]+)''', re.X|re.S).search(parthtml.decode('utf-8'))
                if dest_temp:
                    dest_sub = re.compile(u'''<.*>|参考航班.*$''', re.X|re.S)
                    temp = dest_temp.group(1).replace(u'&#61551;',';').replace(u'&#61521;',';').replace(u',','').replace(u'，','')
                    temp = dest_sub.sub('',temp).strip()
                    places = re.split(u'―+|-+|/|;',temp)
                    if route.dest=='':
                        #到达城市
                        route.dest = places[-1]
                
                #详细描述                
                schedule.s_brief = re.compile(r'''<p>.*?</p>\s*<p>(.*?)</p>''', re.X|re.S).search(parthtml).group(1).strip()
            
                #早餐： 1有、0没有 
                schedule.s_brf = '1' if parthtml.find('早餐')>-1  else '0'
                schedule.s_lunch = '1' if parthtml.find(r'午餐')>-1  else '0'
                schedule.s_dinner = '1' if parthtml.find(r'晚餐')>-1  else '0'
        
                hotel_temp =  re.compile(r'''宿：([^<>]*)</strong>''', re.X|re.S).search(parthtml)   
                #酒店描述：可选       
                if hotel_temp:
                    schedule._hotel = hotel_temp.group(1).replace('住宿：','').strip()
                route.schedules.append(schedule)
    return 

if __name__ == '__main__':
    do_crawl()
    """
    print '---------------end---------------'
    url = 'http://www.cctpage.com/travel/viewcj.asp?id=181774'
    html = urllib2.urlopen(url).read()
    html = html.decode("GB2312",'ignore').encode('utf-8')
    route = Route()
    do_parse(html,route)
    print >>sys.stderr, 'updating:', route.supplier,'， 价格：',route.price, '， 天数：',route.days,'， 出发日期：',route.dates,'， 出发城市：',route.outcity,'， 到达城市：',route.dest,'， title：',route.title
    """

